package priv.menguer.interpreter;

import priv.menguer.interpreter.service.Expression;
import priv.menguer.interpreter.service.impl.AndExpression;
import priv.menguer.interpreter.service.impl.OrExpression;
import priv.menguer.interpreter.service.impl.TerminalExpression;

/**
 * @Title InterpreterPatternDemo.java
 * @description 解释器模式（Interpreter Pattern）提供了评估语言的语法或表达式的方式，它属于行为型模式。
 *              <p>
 * 				这种模式实现了一个表达式接口，该接口解释一个特定的上下文。
 *              </p>
 * 				这种模式被用在 SQL 解析、符号处理引擎等。
 * @time 2018年10月26日 上午11:06:39
 * @author menguer@126.com
 * @version 1.0
 */
public class InterpreterPatternDemo {

	// 规则：Robert 和 John 是男性
	public static Expression getMaleExpression() {
		Expression robert = new TerminalExpression("Robert");
		Expression john = new TerminalExpression("John");
		return new OrExpression(robert, john);
	}

	// 规则：Julie 是一个已婚的女性
	public static Expression getMarriedWomanExpression() {
		Expression julie = new TerminalExpression("Julie");
		Expression married = new TerminalExpression("Married");
		return new AndExpression(julie, married);
	}

	public static void main(String[] args) {
		Expression isMale = getMaleExpression();
		Expression isMarriedWoman = getMarriedWomanExpression();

		System.out.println("John is male? " + isMale.interpret("John"));
		System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
	}
}
